package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.ExperienciaLaboralDAOLocal;
import pe.gob.osce.sirenas.dao.convert.ExperienciaLaboralConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.ExperienciaLaboralDTO;
import pe.gob.osce.sirenas.model.jpa.Capacitacion;
import pe.gob.osce.sirenas.model.jpa.ExperienciaLaboral;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialExperienciaLaboral;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialTrayectoriaArbitral;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class ExperienciaLaboralDAOImpl implements ExperienciaLaboralDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	
	@Override
	public ExperienciaLaboral insertar(ExperienciaLaboral  experienciaLaboral ) throws Exception {
		try{
			em.merge(experienciaLaboral);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return experienciaLaboral;
	}

	@Override
	public List<ExperienciaLaboral> insertList(List<ExperienciaLaboral> listExperienciaLaboral) throws Exception {
		
		List<ExperienciaLaboral> listExperienciaLaboralJPA;
		try{
			listExperienciaLaboralJPA=new ArrayList<ExperienciaLaboral>();
			for (ExperienciaLaboral obj: listExperienciaLaboral) {
				em.merge(obj);
				em.flush();
				listExperienciaLaboralJPA.add(obj);
				
				}		
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}			
			return listExperienciaLaboralJPA;
	}
	
	@Override 
	public ExperienciaLaboral consultarExperienciaLaboral(Long idExperienciaLaboral)
			throws Exception {
		ExperienciaLaboral		experienciaLaborallJPA=null;
		List<ExperienciaLaboral>		listExperienciaLaboralJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT exp FROM ExperienciaLaboral exp WHERE exp.idLaboral = :idLaboral");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idLaboral", idExperienciaLaboral);
			
			List<ExperienciaLaboral> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listExperienciaLaboralJPA=new ArrayList<ExperienciaLaboral>();
				for (ExperienciaLaboral obj: listaObjeto) {					
					experienciaLaborallJPA=(obj);
				}				
			}
		} catch (NoResultException nre) {
			experienciaLaborallJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return experienciaLaborallJPA;
	}	
	
	@Override
	public Boolean insertarHistorialExperienciaLaboral(HistorialExperienciaLaboral historialExperienciaLaboral)throws Exception {
		boolean confirmacion=false;
		
		try {
			em.merge(historialExperienciaLaboral);
			em.flush();
			confirmacion=true;
		} catch (Exception e) {
			confirmacion=false;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
	
		return 	confirmacion;
	}
	
	@Override 
	public List<HistorialExperienciaLaboral> consultarHistorialExperienciaLaboral(Long idExperienciaLaboral)
			throws Exception {
		ExperienciaLaboral		experienciaLaboralJPA=null;
		List<HistorialExperienciaLaboral>		listHistorialExperienciaLaboralJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT exp FROM HistorialExperienciaLaboral exp WHERE exp.idLaboral = :idLaboral");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idLaboral", idExperienciaLaboral);
			
			List<HistorialExperienciaLaboral> listaObjeto=query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				listHistorialExperienciaLaboralJPA=new ArrayList<HistorialExperienciaLaboral>();
				for (HistorialExperienciaLaboral obj: listaObjeto) {					
					listHistorialExperienciaLaboralJPA.add(obj);
				}				
			}
		} catch (NoResultException nre) {
			listHistorialExperienciaLaboralJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return listHistorialExperienciaLaboralJPA;
	}	
	
	

	@Override 
	public List<ExperienciaLaboralDTO>  obtenerListaExpLaboral(Long idFicha)
			throws Exception {

		List<ExperienciaLaboralDTO> listExperienciaLaboralDTO=null;		
		List<ExperienciaLaboral> listaExpLaboralJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
		
			jpql.append("SELECT exp FROM ExperienciaLaboral exp WHERE  exp.idFicha = :idFicha ORDER BY exp.indEspecialidad, exp.auditoria.fechaRegistro DESC ");			
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			List<ExperienciaLaboral>	listaObjeto= query.getResultList();
			if(!listaObjeto.isEmpty()) {
				listaExpLaboralJPA=new ArrayList<ExperienciaLaboral>();
				for (ExperienciaLaboral obj: listaObjeto) {					
					listaExpLaboralJPA.add(obj);
				}
				listExperienciaLaboralDTO=ExperienciaLaboralConvert.createListDTO(listaExpLaboralJPA);
			}
		} catch (NoResultException nre) {
			listExperienciaLaboralDTO=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listExperienciaLaboralDTO;
	}
}
